package add_$14_LinesSynchronized;

/*

运行结果：
全是同一线程的输出
对运行结果的分析：因为当某一个线程执行同步代码块时，其它线程将无法执行当前同步代码块，会发生阻塞，等当前线程执行
完同步代码块，其它的线程才能开始执行该同步代码块。一个线程访问的同步代码块还没执行完，其它线程就无法访问。故同一
线程卖出了所有的票

 */

public class SynchronizedCodeBlock0 {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        SaleThread3 saleThread = new SaleThread3(); // 创建SaleThread对象
        // 创建并开启4个线程
        new Thread(saleThread, "线程一").start();
        new Thread(saleThread, "线程二").start();
        new Thread(saleThread, "线程三").start();
        new Thread(saleThread, "线程四").start();
    }

}
class SaleThread3 implements Runnable {
    private int ticket = 100; // 十张票
    Object lock = new Object();
    // 以任意一个对象作为锁，只要任意一个对象抢到了锁，执行代码块中的内容时，其它的对象无法访问代码块中的内容
    @Override
    public void run() {
        // TODO Auto-generated method stub
        //同步代码块
        synchronized (lock) {
            while (ticket > 0) {
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
                System.out.println(Thread.currentThread().getName() + "---卖出的票号为：" + ticket--);
            }
        }
    }
}